package excercise;

public class EX05_OOP4 {
	

	public static void main(String[] args) {
		Retanglevo re = new Retanglevo(4,40,"red");
		Retangleservice.getArea(re.width, re.height);
		float area = Retangleservice.getPerimeter(re.width, re.height);
		float per  = Retangleservice.getPerimeter(re.width *2, re.height *2);
		System.out.println("width =" +re.width + "height ="  + re.height + "color +"  + re.color);
		System.out.println(area);
		System.out.println(per);
		Retanglevo2 rr = new Retanglevo2();
		rr.setWidth(4);
		rr.setHeight(40);
		rr.setColor("blue");
		System.out.println("rr의면적은" + (rr.getWidth() * rr.getHeight()));
		System.out.println("rr의둘레는" + (rr.getWidth()*2 + rr.getHeight()*2));
	
	Retanglevo ra = new Retanglevo(3,35.9f,"orange");
	Retangleservice.getArea(ra.width, ra.height);
	float area2 = Retangleservice.getPerimeter(ra.width, ra.height);
	float per2  = Retangleservice.getPerimeter(ra.width *2, ra.height *2);
	System.out.println("width =" +ra.width + "height ="  + ra.height + "color +"  + ra.color);
	System.out.println(area2);
	System.out.println(per2);
	
	//Fanvo f = new fanvo(1,true,10,"yellow");
	//Fanvo f = new fanvo(new Fanvo().fast,true,10,"yellow");
	Fanvo f = new Fanvo(5, "yellow", Fanvo.fast, true);
	System.out.println(
	//Fanvo.showFaninfo(f.speed, f.on, f.radius , f.color));
	Fanse.showFaninfo(f));
	
	Fanvo fe = new Fanvo(10, "blue", Fanvo.medium, false);
	System.out.println(
	Fanse.showFaninfo(fe));
	
	Accountvo a = new Accountvo(12345,20000,4.5f,"20131108");
	float inter = Accountservice.get(a.inter / 12);
	System.out.println(inter);
	//Accountservice.withDraw(2500, a.balance);
	//System.out.println(a.balance);
	//call by value(값의 의해 전달)
	// 메서드의 매겨변수 유형이 기본 자료형인 경우
	// 기본 자료형 변수를 메서드의 매겨변수로 전달하면 
	// JAM은 전달된 변수의 값은
	// 메서드의 지역변수에 그 값을 복사해줌
	// 따라서, 지역변수의 값을 변경하지않더라도, 전달해준 변수에 영향을 미치지는 않음
	
	
	Accountservice.withDraw(2500, a);
	System.out.println(a.balance);
	// call by reference (주소에 의한 전달).
	// 메서드의 매개변수유형이 참조 자료형인 경우
	// 만일 참조형 변수를 메서드의 매개변수로 전달하면
	// 지역변수는 참조형 변수가 전달해준 객체를 가리키게 됨
	// 즉 , 참조형 변수에 저장된 값은 실제 값이 아니고
	// 그 값을 가리키는 주소를 의미하기 떄문임
	// 따라서 , 메서드에서 참조된 객체에 변경을 가하면
	// 그 변화는 호출된 코드에도 반영됨
	
	Accountservice.deposit(2500, a.balance);
	}

}

class Retanglevo{
	
	float width;
	float height;
	String color;
	
	public Retanglevo() {
		width = 1.0f;
		height = 1.0f;
		color = "white";
	}
	public Retanglevo(float width , float height, String color){
		this.width = width;
		this.height = height;
		this.color = color;
	}
	
}

class Retangleservice{
	static float getArea(float width, float height){ return width * height;}
	static float getPerimeter(float width, float height){return (width *2) + (height *2);}
}

class Fanvo{
	// 속도를 나타내는 상수들은 객체 생성 없이 바로 사용이 가능해야함
	// 따라서 ,static final 예약어를 사용함
	// 한편 , JDK5 이상에서는 이것을 대체하기 위해 
	// Enum 이라는 새로운 클래스 자료형이 추가됨
	static final int slow = 1;
	static final int medium = 2;
	static final int fast = 3;
	
	int speed;
	boolean on;
	float radius;
	String color;
	public Fanvo(){
		speed = slow;
		on = false;
	    radius = 5.0f;
		color = "blue";
	}
	public Fanvo(float radius, String color, int speed, boolean on){
		this.speed = speed;
		this.on = on;
		this.radius = radius;
		this.color = color;
	}
}
	
class Fanse{
	// 메서드 다중정의 overloading
	// 메서드 서명만 다르면 메서드 이름은 동일 하게 작성가능
	static String showFaninfo(Fanvo f) {
		String msg;
		if(f.on)
		msg = "크기는 :" + f.radius + "색깔은" + f.color + f.speed + "동작중";
		else 
			msg ="크기는 :" + f.radius + "색깔은" + f.color + f.speed + "꺼져있음";
		return msg;
		}
}
class Accountvo{
	int aid;
	int balance;
	float inter;
	String date;
	public Accountvo() {
		aid = 0;
		balance = 0;
		inter = 0;
	}
	public Accountvo(int aid, int balance, float inter, String date){
	this.aid = aid; this.balance = balance; this.inter = inter; this.date = date;
}
}
class Accountservice{
	static float get(float inter){
	 return inter / 12;
	}

	 static int withDraw(int gold, Accountvo a){		// Accountvo 는 참조형변수
		 a.balance -= gold;
		 System.out.println("잔액" + a.balance);
			return a.balance;
			}
	

	 static int deposit(int gold, int balance){
		 balance += gold;
		 System.out.println("입금후잔액" + balance);
			return balance;
}
}
class Retanglevo2{
	//멤버 변수
	private float width;
	private float height;
	private String color;
	//생성자
	public Retanglevo2() {}
	public Retanglevo2(float width , float height , String color){
	}

	// setter/getter
		public void setWidth(float width){
			this.width = width;
			}
		public float getWidth(){
			return width;
			}
		public void setHeight(float height){
			this.height = height;
			}
		public float getHeight(){
			return height;
			}
		public void setColor(String color){
			this.color = color;
		}
		public String getColor(){
			return color;
		}
}